Global COVID-19 Dashboard

Author

Charles Olalekan Collins

Published

February 28, 2025

Column

World Covid 19 Map

# Interactive Line Chart with Crosstalk Linking

# Ensure Valid Data for Mapping
valid_map_data <- map_data %>% filter(!is.na(Latitude) & !is.na(Longitude))

# Define Color Palette Based on Confirmed Cases
pal <- colorBin(
  palette = c("green", "yellow", "orange", "red", "darkred"),
  domain = valid_map_data$Confirmed,
  bins = c(0, 1000, 10000, 50000, 100000, Inf),
  na.color = "gray"
)

if (nrow(valid_map_data) > 0) {
  leaflet(valid_map_data) %>%
    addTiles() %>%
    addCircleMarkers(
      lng = ~Longitude, lat = ~Latitude,
      radius = ~ifelse(Confirmed > 0, sqrt(Confirmed)/100, 2),
      color = ~pal(Confirmed),
      stroke = FALSE, fillOpacity = 0.7,
      popup = ~paste(
        "<strong>Country:</strong>", Country, "<br/>",
        "<strong>Confirmed:</strong>", Confirmed, "<br/>",
        "<strong>Deaths:</strong>", Deaths, "<br/>",
        "<strong>Recovered:</strong>", Recovered, "<br/>",
        "<strong>Active:</strong>", Active
      )
    ) %>%
    addLegend(
      position = "bottomright",
      pal = pal,
      values = valid_map_data$Confirmed,
      title = "Confirmed Cases",
      opacity = 1,
      labFormat = labelFormat(suffix = " cases")
    ) %>%
    fitBounds(
      lng1 = min(valid_map_data$Longitude, na.rm = TRUE),
      lat1 = min(valid_map_data$Latitude,  na.rm = TRUE),
      lng2 = max(valid_map_data$Longitude, na.rm = TRUE),
      lat2 = max(valid_map_data$Latitude,  na.rm = TRUE)
    )
} else {
  cat("No valid map data available for the latest date.")
}

Interactive Table

datatable(
  covid_data,
  options = list(
    server = TRUE,   # enable server-side processing
    pageLength = 10,
    autoWidth = TRUE
  ),
  caption = "COVID-19 Data (All Rows)"
)
Warning in instance$preRenderHook(instance): It seems your data is too big for
client-side DataTables. You may consider server-side processing:
https://rstudio.github.io/DT/server.html

Column

Cases

# Check that pie_data has valid totals:
if (nrow(pie_data) == 0 || sum(pie_data$Count, na.rm = TRUE) == 0) {
  cat("No data available for the distribution chart on the latest date.")
} else {
  p_bar <- ggplot(pie_data, aes(x = reorder(Category, -Count), y = Count, fill = Category)) +
    geom_bar(stat = "identity") +
    labs(title = paste("Distribution on", latest_date),
         x = "Category",
         y = "Count") +
    theme_minimal() +
    theme(legend.position = "none")
  
  plotly::ggplotly(p_bar)
}
 plotly::ggplotly(bar_chart)

Total WHO Region

plotly::ggplotly(stacked_bar)